package com.principle.inverse.improve;

public class DependencyPass {
    public static void main(String[] args) {
        // 方式一
//        ChangeHong changeHong = new ChangeHong();
//        OpenAndClose openAndClose = new OpenAndClose();
//        openAndClose.open(changeHong);
        // 方式二：构造器
//        ChangeHong changeHong = new ChangeHong();
//        OpenAndClose openAndClose = new OpenAndClose(changeHong);
//        openAndClose.open();
        // 方式三： setter方式
        ChangeHong changeHong = new ChangeHong();
        OpenAndClose openAndClose = new OpenAndClose();
        openAndClose.setTv(changeHong);
        openAndClose.open();
    }
}

// 方式一: 通过接口传递实现依赖
// 开关的接口
//interface IOpenAndClose {
//    public void open(ITV tv);
//}
//
//interface ITV { //ITV接口
//    public void play();
//}
//
//class ChangeHong implements ITV {
//
//    @Override
//    public void play() {
//        System.out.println("长虹电视机，打开");
//    }
//}
//
//// 实现接口
//class OpenAndClose implements IOpenAndClose {
//
//    @Override
//    public void open(ITV tv) {
//        tv.play();
//    }
//}

// 方式二：通过构造方法传递依赖
//interface IOpenAndClose {
//    public void open(); //抽象方法
//}
//
//interface ITV { //ITV接口
//    public void play();
//}
//
//class ChangeHong implements ITV {
//
//    @Override
//    public void play() {
//        System.out.println("长虹电视机，打开");
//    }
//}
//
//class OpenAndClose implements IOpenAndClose{
//
//    public ITV tv;
//    public OpenAndClose(ITV tv){
//        this.tv = tv;
//    }
//    @Override
//    public void open() {
//        this.tv.play();
//    }
//}
// 方式三，通过setter方法传递
interface IOpenAndClose {
    public void open(); //抽象方法

    public void setTv(ITV tv);
}

interface ITV { //ITV接口
    public void play();
}

class ChangeHong implements ITV {

    @Override
    public void play() {
        System.out.println("长虹电视机，打开");
    }
}

class OpenAndClose implements IOpenAndClose {
    private ITV tv; //实现接口的对象实例

    @Override
    public void open() {
        this.tv.play();
    }

    @Override
    public void setTv(ITV tv) {
        this.tv=tv;
    }
}